'use strict';
/**
 * error controller
 */
export default class extends think.controller.base {
    /**
     * display error page
     * @param  {Number} status []
     * @return {Promise}        []
     */
    displayError(status) {

            //hide error message on production env
            if (think.env === 'production') {
                this.http.error = null;
            }

            let errorConfig = this.config('error');
            let message = this.http.error && this.http.error.message || '';
            if (this.isJsonp()) {
                return this.jsonp({
                    [errorConfig.key]: status,
                    [errorConfig.msg]: message
                })
            } else if (this.isAjax()) {
                return this.fail(status, message);
            }

            let module = 'common';
            if (think.mode !== think.mode_module) {
                module = this.config('default_module');
            }
            let file = `${module}/error/${status}.html`;
            let options = this.config('tpl');
            options = think.extend({}, options, {
                type: 'base',
                file_depr: '_'
            });

            this.fetch(file, {}, options).then(content => {
                content = content.replace('ERROR_MESSAGE', message);
                this.type(options.content_type);
                this.end(content);
            });
        }
        /**
         * Bad Request 
         * @return {Promise} []
         */
    _400Action() {
            return this.displayError(400);
        }
        /**
         * Forbidden 
         * @return {Promise} []
         */
    _403Action() {
            return this.displayError(403);
        }
        /**
         * Not Found 
         * @return {Promise}      []
         */
    _404Action() {
            return this.displayError(404);
        }
        /**
         * Internal Server Error
         * @return {Promise}      []
         */
    _500Action() {
            return this.displayError(500);
        }
        /**
         * Service Unavailable
         * @return {Promise}      []
         */
    _503Action() {
        return this.displayError(503);
    }
}
